<!DOCTYPE HTML>
<html>
<head>
<title>线程 | AutoHotkey</title>
<meta name="description" content="The &quot;current thread&quot; is defined as the flow of execution invoked by the most recent event; examples include hotkeys, SetTimer subroutines, custom menu items, and GUI events." />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>

<body>
<h1>线程</h1>

<p>最近事件调用的执行流被定义为 <em>当前线程</em>; 例如包括<a href="../Hotkeys.htm">热键</a>, <a href="../commands/SetTimer.htm">SetTimer 子程序</a>, <a href="../commands/Menu.htm">自定义菜单项</a>以及 <a href="../commands/Gui.htm#Events">GUI 事件</a>. <em>当前线程</em> 可以在它自身子程序或由那个子程序调用其他子程序中执行命令.</p>
<p>尽管 AutoHotkey 实际并不支持多线程, 但它模拟了多线程的某些特性: 如果启动了第二个线程, 例如在前一个热键仍在执行时又按了另一个热键, 那么 <em>当前线程</em> 会被中断(暂时停止) 来让新的线程成为 <em>当前</em> 线程. 如果在第二个线程还在运行时又启动了第三个线程, 那么第二个和第一个线程都会进入休眠状态, 依此类推.</p>
<p>当 <em>当前线程</em> 结束时, 最近中断的线程将恢复执行, 依此类推, 直到最后所有的线程都结束. 当线程被恢复时, 它的设置例如 <a href="ErrorLevel.htm">ErrorLevel</a> 和 <a href="../commands/SendMode.htm">SendMode</a> 会自动恢复到中断前的状态; 换句话说, 中断不会给线程带来副作用(不过<a href="../commands/WinActivate.htm">活动窗口</a>可能会变化而产生影响).</p>
<p class="note"><strong>注意</strong>: <a href="../commands/KeyHistory.htm">KeyHistory</a> 命令/菜单项会显示处于中断状态的线程数量, 而 <a href="../commands/ListHotkeys.htm">ListHotkeys</a> 命令/菜单项则显示哪些热键拥有线程.</p>
<p>一个脚本可以同时含有多个 <a href="../commands/MsgBox.htm">MsgBox</a>, <a href="../commands/InputBox.htm">InputBox</a>, <a href="../commands/FileSelectFile.htm">FileSelectFile</a> 和 <a href="../commands/FileSelectFolder.htm">FileSelectFolder</a> 对话框. 这是在前一个线程已经显示对话框后启动新线程(通过<a href="../Hotkeys.htm">热键</a>, <a href="../commands/SetTimer.htm">定时子程序</a>, <a href="../commands/Menu.htm">自定义菜单项</a>等) 实现的.</p>
<p>默认情况下, 子程序仍在运行的<a href="../Hotkeys.htm">热键</a>或<a href="Hotstrings.htm">热字串</a>不能再次启动. 使用 <a href="../commands/_MaxThreadsPerHotkey.htm">#MaxThreadsPerHotkey</a> 可以改变此特性.</p>
<h2>线程优先级</h2>
<p>优先级低于 <em>当前线程</em> 的任何线程(<a href="../Hotkeys.htm">热键</a>, <a href="../commands/SetTimer.htm">定时子程序</a>, <a href="../commands/Menu.htm">自定义菜单项</a>等) 不能中断当前线程. 在这种时候, 这样的计时器不会运行, 且用户试图创建线程(例如按下<a href="../Hotkeys.htm">热键</a>或 <a href="../commands/GuiControls.htm#Button">GUI 按钮</a>) 会没有效果, 也不会被缓存起来. 由于这个原因, 通常在设计时最好让高优先级的线程快速结束, 或使用 <a href="../commands/Critical.htm">Critical</a> 而不将它们设置成高优先级.</p>
<p>默认的优先级为 0. 所有线程使用默认的优先级, 不过可以使用下列的其中一种方法改变:<br>1) 通过 <a href="../commands/SetTimer.htm">SetTimer</a> 给定时子程序指定优先级.<br>2) 通过 <a href="../commands/Hotkey.htm">Hotkey</a> 命令给热键指定优先级.<br>3) <a href="../Hotstrings.htm">热字串</a>在定义时或通过 <a href="../commands/_Hotstring.htm">#Hotstring</a> 可以指定优先级. <br>4) 通过 <a href="../commands/Menu.htm">Menu</a> 命令给自定义菜单项指定优先级.<br>5) 通过 <a href="../commands/Thread.htm">Thread</a> 命令给<em>当前线程</em>设置自己的优先级.</p>
<p>不论<em>当前线程</em>的优先级如何, <a href="../commands/OnExit.htm">OnExit</a> 子程序(如果有) 被调用时总是会运行.</p>
</body>
</html>